#!/usr/bin/perl

#use strict;
use warnings;
use Switch;

use constant TRUE => 1;
use constant FALSE => 0;


# TODO Verificar ambientea

# Variables globales para las consultas
$PROC_DIR = $ENV{'PROCDIR'};
$MAE_DIR = $ENV{'MAEDIR'};
$MAE_FILE = "$MAE_DIR/PPI.mae";
$PATH_ARCHIVO_SALIDA = $ENV{'REPODIR'};


my $pais = '';
my $sistema = '';
my $anioDesde = '';
my $mesDesde = '';
my $anioHasta = '';
my $mesHasta = '';
my $FLAG_MODO = '';
my $grabarEnArchivo = FALSE;
my $porcentaje = 0;
my $monto = 0;

my $RESULTADO_RECEPCION = LeerParametros();

sub clear_screen
{
	system("clear");
}

sub LeerParametros{

	my $CANT_PARAMETROS = @ARGV;
	my $i = 0;
	my $esModo = TRUE;
	my $esNombrePais = TRUE;
	my $esCodigoSistema = TRUE;
	my $esFecha = TRUE;
	for ($i=0; $i<$CANT_PARAMETROS; $i++) {
		$esModo = verificarModo($ARGV[$i]);
		$esNombrePais = verificarNombrePais($ARGV[$i]);
		$esCodigoSistema = verificarCodigoSistema($ARGV[$i]);
		$esFecha = verificarFecha($ARGV[$i]);
	}

	if ( !$esModo && !$esNombrePais && !$esCodigoSistema && !$esFecha) {
		print "No es un parametro correcto \n";
		exit(1);
	}

	switch ($FLAG_MODO) {
		case('-h') {
			&MostrarAyuda;
			exit(0); 
		}
		case('-w') {
			$grabarEnArchivo = TRUE;
		}
	}
	
	if ($pais eq ''){
		&printConfiguracion();
		print "Ingrese el nombre del pais: ";				
		my $value = <STDIN>;
		chomp($value);
		if (!verificarNombrePais($value)) {
			print "\nNombre de pais incorrecto.\n"
		} else {
			&MostrarMenu;
		}
	} else {
		&MostrarMenu;
	}
}

sub cargarParametrosSTDIN(){
	my $input = '';	
	while ($input ne '6')
	{	
		&printConfiguracion();
		print "1. Cargar pais\n";
		print "2. Cargar codigo sistema\n";
		print "3. Cargar anio, periodo o rango\$\n";
		print "4. Activar salida por archivo\n";
		print "5. Desactivar salida por archivo\n";
		print "6. Volver atras\n";
		print "Seleccione una opción: ";
		$input = <STDIN>;
		chomp($input);
		switch ($input) {
			case(1) {
				print "\nIngrese el nombre del pais: ";				
				my $value = <STDIN>;
				chomp($value);
				verificarNombrePais($value);
			}
		  	case(2) {
				print "\nIngrese el codigo de sistema: ";				
				my $value = <STDIN>;
				chomp($value);
				verificarCodigoSistema($value);
			 }
		  	case(3) {
				print "\nIngrese el anio, la fecha o el rango: ";
				my $value = <STDIN>;
				chomp($value);
				verificarFecha($value);
			}
		  	case(4) {
				$grabarEnArchivo = TRUE;
			}
		  	case(5) {
				$grabarEnArchivo = FALSE;
			}
		}
	}
}

sub printConfiguracion(){
	&clear_screen;
	print "----------------------------------------------------------------------------------------------------------\n";
	print "Pais: $pais\n";
	print "Codigo Sistema: $sistema\n";
	print "$anioDesde/$mesDesde to $anioHasta/$mesHasta \n";
	print "Porcentaje $porcentaje%\n";
	print "Delta Monto \$$monto\n";
	if ($grabarEnArchivo) {
		print "Grabar en archivo activado\n"
	} else {
		print "Grabar en archivo desactivado\n"
	}
	print "----------------------------------------------------------------------------------------------------------\n";
}

# Pre: El valor a evaluar se da por parametro.
# Post: Se verifica que sea un modo correcto.
sub verificarModo{
	my $valor = "@_";
	if (($valor eq '-h') || ($valor eq '-w')){
		$FLAG_MODO=$valor;
		return TRUE;
	}
	return FALSE;	
}

# Pre: El valor a evaluar se da por parametro.
# Post: Se verifica que sea un nombre de pais correcto.
sub verificarNombrePais{
	my $valor = "@_";
	if ($valor =~ /^([A-Z][a-z]*)$/) {
		$pais = substr($valor,0,1);
		return TRUE;
	} else {
		return FALSE;
	}
}

# Pre: El valor a evaluar se da por parametro.
# Post: Se verifica que sea un codigo de sistema correcto.
sub verificarCodigoSistema{
	my $valor = "@_";
	if ( ($valor =~ /^[0-9]$/) || ($valor =~ /^[1-9][0-9]$/) || ($valor =~ /^[1-9][0-9][0-9]$/) ) {
		$sistema = $valor;
		return TRUE;
	} else {
		return FALSE;
	}
}
# Pre: El valor a evaluar se da por parametro.
# Post: Se verifica que el parametro sea una fecha un periodo o rango correcto obteniendo el siguiente resultado en cada caso:
#	1) Si es un anio: anioDesde y anioHasta en el mismo valor, y mesDesde y mesHasta en enero y diciembre respectivamente.
#	2) Si es un periodo: anioDesde igual a anioHasta, y mesDesde igual a mesHasta.
#	3) Si es un rango: se verifica que las fechas del rango sean correctas y que desde sea menor que hasta.
sub verificarFecha{
	my $valor = "@_";
	if ($valor =~ /^[0-9][0-9][0-9][0-9]$/) {
		$anioDesde = substr($valor,0,4);
		$mesDesde = "01";
		$anioHasta = $anioDesde;
		$mesHasta = "12";
		return TRUE;
	} else {
		if ( ($valor =~ /^[0-9][0-9][0-9][0-9]-[1][0-2]$/) || ($valor =~ /^[0-9][0-9][0-9][0-9]-[0][1-9]$/) ){
			$anioDesde = substr($valor,0,4);
			$mesDesde = substr($valor,5,2);		
			$anioHasta = $anioDesde;
			$mesHasta = $mesDesde;
			return TRUE;
		} else {
			#substr(CADENA,DESPLAZAMIENTO,LONGITUD);
			if ( ($valor =~ /^[0-9][0-9][0-9][0-9]-[1][0-2]..[0-9][0-9][0-9][0-9]-[1][0-2]$/) || 
			     ($valor =~ /^[0-9][0-9][0-9][0-9]-[0][1-9]..[0-9][0-9][0-9][0-9]-[0][1-9]$/) ||
			     ($valor =~ /^[0-9][0-9][0-9][0-9]-[1][0-2]..[0-9][0-9][0-9][0-9]-[0][1-9]$/) || 
			     ($valor =~ /^[0-9][0-9][0-9][0-9]-[0][1-9]..[0-9][0-9][0-9][0-9]-[1][0-2]$/)){
				my $anioDesdeAux = substr($valor,0,4);
				my $mesDesdeAux = substr($valor,5,2);		
				my $anioHastaAux = substr($valor,9,4);
				my $mesHastaAux = substr($valor,14,2);
				if ($anioDesdeAux < $anioHastaAux){
					$anioDesde = $anioDesdeAux;
					$mesDesde = $mesDesdeAux;
					$anioHasta = $anioHastaAux;
					$mesHasta = $mesHastaAux;
					return TRUE;	
				} else {
					if ( ($anioDesdeAux == $anioHastaAux) && ($mesDesdeAux <= $mesHastaAux) ){
						$anioDesde = $anioDesdeAux;
						$mesDesde = $mesDesdeAux;
						$anioHasta = $anioHastaAux;
						$mesHasta = $mesHastaAux;
						return TRUE;	
					} else {
						return FALSE;
					}
				}
			} else {
				return FALSE;
			}
		}
	}
}

sub MostrarAyuda{
	print "Uso del comando: ReporteY.pl [Modo] [NombrePais] [CodigoSistema] [Fecha]\n";
	print "[Modo] : Opcional, Valores posibles\n";
	print "    -h  -> Ayuda. \n";
	print "    -w  -> Graba en archivo. \n";
	print "[NombrePais] : Opcional, hasta 3 digitos\n";
	print "    En caso de no especificar, se le preguntará al iniciar el comando.\n";
	print "[CodigoSistema] : Opcional\n";
	print "[Fecha] : Opcional, valores posibles\n";
	print "    Anio: yyyy\n";
	print "    Periodo: yyyy-mm\n";
	print "    Rango de periodos: yyyy-mm..yyyy-mm\n";
}

sub MostrarMenu{
	my $input = '';	
	while ($input ne '5')
	{		
		&printConfiguracion();
		print "1. Comparación para el recalculo\n";
		print "2. Diferencia (en valor absoluto) mayor al X%\n";
		print "3. Diferencia (en valor absoluto) mayor a X\$\n";
		print "4. Cambiar parametros\n";
		print "5. Salir\n";
		print "Seleccione una opción: ";
		$input = <STDIN>;
		chomp($input);
		switch ($input) {
			case(1) {
				&ComparacionRecalculo($pais,$sistema,$anioDesde,$mesDesde,$anioHasta,$mesHasta);
				print "\n\nPresione cualquier tecla para continuar\n";
				my $cont = <STDIN>;
			}
		  	case(2) {
				print "\nIngrese un porcentaje de comparacion: ";
				my $aux = <STDIN>;
				chomp($aux);	
				if (validarPorcentaje($aux)) {				
					&DiferenciaEnPorcentaje($pais,$sistema,$anioDesde,$mesDesde,$anioHasta,$mesHasta,$porcentaje);
					#exit(0);
					print "\n\nPresione cualquier tecla para continuar\n";
					my $cont = <STDIN>;
				}
			 }
		  	case(3) {
				print "\nIngrese un monto de comparacion: ";
				my $aux = <STDIN>;
				chomp($aux);	
				if (validarMonto($aux)){
					&DiferenciaEnPesos($pais,$sistema,$anioDesde,$mesDesde,$anioHasta,$mesHasta,$monto);
					#exit(0);
					print "\n\nPresione cualquier tecla para continuar\n";
					my $cont = <STDIN>;
				}
			}
		  	case(4) {
				cargarParametrosSTDIN();
			}
			case(5) {
				exit(0);
			} 
		}
	}
}

sub validarMonto(){
	my $valor = "@_";
	if ( ($valor =~ /^[0-9]*$/) || ($valor =~ /^([1-9][0-9]*)$/) ||
	     ($valor =~ /^[0-9],[0-9][0-9]$/) || ($valor =~ /^([1-9][0-9]*,[0-9][0-9])$/)){
		$monto = $valor;
		return TRUE;
	} else {
		return FALSE;
	}
}

sub validarPorcentaje(){
	my $valor = "@_";
	if ( ($valor =~ /^[0-9]$/) || ($valor =~ /^([1-9][0-9]*)$/) ){
		$porcentaje = $valor;
		return TRUE;
	} else {
		return FALSE;
	}
}

sub FiltrarMae
{
	my($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta) = @_;

	# 1. Filtro el archivo maestro
	my @FILTRO_MAE = `grep "^$Pais;$CodigoSistema;" "$MAE_FILE"`;

	return @FILTRO_MAE;
}

sub CargarDatosRegMae
{
	my($regmae) = @_;
	my %MaeActual;
	my @DatosMae = split(/;/,$regmae);
	$MaeActual{Anio} = $DatosMae[2];
	$MaeActual{Mes} = sprintf("%02d",$DatosMae[3]);
	$MaeActual{Dia} = sprintf("%02d",$DatosMae[4]);
	$MaeActual{FechaContable} = "$MaeActual{Anio}$MaeActual{Mes}$MaeActual{Dia}";
	$MaeActual{Valido} = 0;

	if ($MaeActual{FechaContable} >= $FechaContableDesde && $MaeActual{FechaContable} <= $FechaContableHasta)
	{
		$MaeActual{Estado} = $DatosMae[5];
		$MaeActual{CodigoPrestamo} = $DatosMae[7];
		#$Monto = $Pres + $Impago + $Inde + $Innode - $Deb;
		chomp($DatosMae[9] = `echo $DatosMae[9] | sed 's/,/./'`);
		chomp($DatosMae[10] = `echo $DatosMae[10] | sed 's/,/./'`);
		chomp($DatosMae[11] = `echo $DatosMae[11] | sed 's/,/./'`);
		chomp($DatosMae[12] = `echo $DatosMae[12] | sed 's/,/./'`);
		chomp($DatosMae[13]);
		chomp($DatosMae[13] = `echo $DatosMae[13] | sed 's/,/./'`);
		$MaeActual{MontoRestante} = $DatosMae[9]+$DatosMae[10]+$DatosMae[11]+$DatosMae[12]-$DatosMae[13];
		$MaeActual{Valido} = 1;
	}

	return %MaeActual;
}

sub ObtenerPrestamo
{
	my($Pais,$CodigoPrestamo,$AnoContable,$MesContable) = @_;

	# 3. Obtengo registro del prestamos.pais
	# Leo del archivo de configuracion la variable MAE_DIR
	my @FILTRO_PRESTAMO = `grep "^[^;]*;$AnoContable;$MesContable;[^;]*;[^;]*;$CodigoPrestamo;" "$PROC_DIR/PRESTAMO.$Pais"`;

	# Obtengo el registro del PRESTAMO.PAIS
	my $FechaContableMaxima = 10000101;
	my $FechaProcesoMaxima = 10000101;
	my %Prestamo;
	$Prestamo{Valido}=0;
	foreach my $regpres (@FILTRO_PRESTAMO)
	{
		my %PrestamoActual;
		my @DatosPrestamo = split(/;/,$regpres);
		$PrestamoActual{Anio} = $DatosPrestamo[1];
		$PrestamoActual{Mes} = $DatosPrestamo[2];
		$PrestamoActual{Dia} = $DatosPrestamo[3];
		$PrestamoActual{FechaProceso} = &DesformatearFecha($DatosPrestamo[14]);
		$PrestamoActual{FechaContable} = "$PrestamoActual{Anio}$PrestamoActual{Mes}$PrestamoActual{Dia}";
		$PrestamoActual{Estado} = $DatosPrestamo[4];
		chomp($PrestamoActual{MontoRestante} = `echo $DatosPrestamo[11] | sed 's/,/./'`);
		$PrestamoActual{CodigoCliente} = $DatosPrestamo[12];
		$PrestamoActual{Valido}=1;

		if ($FechaContableMaxima < $PrestamoActual{FechaContable} || ($FechaContableMaxima == $PrestamoActual{FechaContable} && $FechaProcesoMaxima < $PrestamoActual{FechaProceso}))
		{
			$FechaContableMaxima = $PrestamoActual{FechaContable};
			$FechaProcesoMaxima = $PrestamoActual{FechaProceso};
			# Guardo los datos del registro
			%Prestamo = %PrestamoActual;
		}
	}
	return %Prestamo;
}

sub DesformatearFecha
{
	my($Fecha) = @_;

	my @ArrayFecha = split(/\//,$Fecha);
	my $Anio = $ArrayFecha[2];
	my $Mes = $ArrayFecha[1];
	my $Dia = $ArrayFecha[0];
	my $retFecha = "$Anio$Mes$Dia";

	return $retFecha;
}

sub printConfiguracionArchivo
{
	print ARCH_SALIDA "----------------------------------------------------------------------------------------------------------\n";
	print ARCH_SALIDA "Pais: $pais\n";
	print ARCH_SALIDA "Codigo Sistema: $sistema\n";
	print ARCH_SALIDA "$anioDesde/$mesDesde to $anioHasta/$mesHasta \n";
	print ARCH_SALIDA "Porcentaje $porcentaje%\n";
	print ARCH_SALIDA "Delta Monto \$$monto\n";
	print ARCH_SALIDA "----------------------------------------------------------------------------------------------------------\n";
}

sub ComparacionRecalculo{

	my($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta) = @_;

	if ($CodigoSistema eq "") { $CodigoSistema = "[^;]*"; }
	if ($AnoContableDesde eq "") { $AnoContableDesde = "2001"; }
	if ($MesContableDesde eq "") { $MesContableDesde = "1"; }
	if ($AnoContableHasta eq "") { $AnoContableHasta = "2020"; }
	if ($MesContableHasta eq "") { $MesContableHasta = "12"; }

	$MesContableDesdeFormateado = sprintf("%02d", $MesContableDesde);
	$FechaContableDesde = "${AnoContableDesde}${MesContableDesdeFormateado}01";
	$MesContableHastaFormateado = sprintf("%02d", $MesContableHasta);
	$FechaContableHasta = "${AnoContableHasta}${MesContableHastaFormateado}31";

	# 1. Filtro el archivo maestro
	my @FILTRO_MAE = &FiltrarMae($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta);
	#print @FILTRO_MAE;

	my @SALIDA;
	# 2. Calculo el monto restante de cada registro del maestro
	foreach my $regmae (@FILTRO_MAE)
	{
		my %MaeActual = &CargarDatosRegMae($regmae);
		if ($MaeActual{Valido} == 1)
		{
			my %Prestamo = &ObtenerPrestamo($Pais,$MaeActual{CodigoPrestamo},$MaeActual{Anio},sprintf("%02d",$MaeActual{Mes}));

			if ($Prestamo{Valido} == 1)
			{
				my %Salida;
				$Salida{CodigoPrestamo} = $MaeActual{CodigoPrestamo};
				$Salida{CodigoCliente} = $Prestamo{CodigoCliente};
				$Salida{EstadoMaestro} = $MaeActual{Estado};
				$Salida{EstadoPrestamo} = $Prestamo{Estado};
				$Salida{MontoMaestro} = $MaeActual{MontoRestante};
				$Salida{MontoPrestamo} = $Prestamo{MontoRestante};
		
		
				# Comparo con el registro de prestamos ($prestamo_ok) -- Cuarto Paso --
				if (($MaeActual{Estado} eq "SMOR" && $Prestamo{Estado} ne "SMOR") || ($MaeActual{MontoRestante} < $Prestamo{MontoRestante}))
				{
					$Salida{Recomendacion} = "RECALCULO";
				}else{
					$Salida{Recomendacion} = "BUENO";
				}
				push @SALIDA, {%Salida};
			}
		}
	}
	&MostrarResultadosConsulta1(@SALIDA);
}

sub MostrarResultadosConsulta1
{
	my(@SALIDA) = @_;
	my $arrSize = @SALIDA;
	# Títulos
	my $CodigoPrestamoTitulo = sprintf("%17s", 'Cód.Pŕestamo');
	my $CodigoClienteTitulo = sprintf("%15s", 'Cód.Cliente');
	my $EstadoMaestroTitulo = sprintf("%16s", 'Estado (MAE)');
	my $EstadoPrestamoTitulo = sprintf("%17s", 'Estado (PREST)');
	my $MontoMaestroTitulo = sprintf("%24s", 'Monto Restante (MAE)');
	my $MontoPrestamoTitulo = sprintf("%26s", 'Monto Restante (PREST)');
	my $RecomendacionTitulo = sprintf("%19s", 'Recomendación');

	my $Titulo = "$CodigoPrestamoTitulo"."|"."$CodigoClienteTitulo"."|"."$EstadoMaestroTitulo"."|"."$EstadoPrestamoTitulo"."|"."$MontoMaestroTitulo"."|"."$MontoPrestamoTitulo"."|"."$RecomendacionTitulo"."|"."\n";

	print "$Titulo";
	if ($grabarEnArchivo)
	{
		&crearArchivoSalida;
		&printConfiguracionArchivo;
		print ARCH_SALIDA "$Titulo";
	}

	for (my $i=0; $i < $arrSize; $i++)
	{
		my $CodigoPrestamo = sprintf("%15s", $SALIDA[$i]{CodigoPrestamo});
		my $CodigoCliente = sprintf("%14s", $SALIDA[$i]{CodigoCliente});
		my $EstadoMaestro = sprintf("%16s", $SALIDA[$i]{EstadoMaestro});
		my $EstadoPrestamo = sprintf("%17s", $SALIDA[$i]{EstadoPrestamo});
		my $MontoMaestro = sprintf("%24s", $SALIDA[$i]{MontoMaestro});
		my $MontoPrestamo = sprintf("%26s", $SALIDA[$i]{MontoPrestamo});
		my $Recomendacion = sprintf("%18s", $SALIDA[$i]{Recomendacion});

		my $mostrar = "$CodigoPrestamo"."|"."$CodigoCliente"."|"."$EstadoMaestro"."|"."$EstadoPrestamo"."|"."$MontoMaestro"."|"."$MontoPrestamo"."|"."$Recomendacion"."|"."\n";

		if ($grabarEnArchivo) {
			print ARCH_SALIDA "$mostrar";
		}
		print "$mostrar";
	}
	if ($grabarEnArchivo) {&cerrarArchivoSalida;}
}

sub DiferenciaEnPorcentaje{
	
	my($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta,$PorcentajeComparacion) = @_;

	if ($CodigoSistema eq "") { $CodigoSistema = "[^;]*"; }
	if ($AnoContableDesde eq "") { $AnoContableDesde = "2001"; }
	if ($MesContableDesde eq "") { $MesContableDesde = "1"; }
	if ($AnoContableHasta eq "") { $AnoContableHasta = "2020"; }
	if ($MesContableHasta eq "") { $MesContableHasta = "12"; }

	$MesContableDesdeFormateado = sprintf("%02d", $MesContableDesde);
	$FechaContableDesde = "${AnoContableDesde}${MesContableDesdeFormateado}01";
	$MesContableHastaFormateado = sprintf("%02d", $MesContableHasta);
	$FechaContableHasta = "${AnoContableHasta}${MesContableHastaFormateado}31";

	# 1. Filtro el archivo maestro
	my @FILTRO_MAE = &FiltrarMae($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta);
	#print @FILTRO_MAE;

	my @SALIDA;
	# 2. Calculo el monto restante de cada registro del maestro
	foreach my $regmae (@FILTRO_MAE)
	{
		my %MaeActual = &CargarDatosRegMae($regmae);
		if ($MaeActual{Valido} == 1)
		{
			my %Prestamo = &ObtenerPrestamo($Pais,$MaeActual{CodigoPrestamo},$MaeActual{Anio},sprintf("%02d",$MaeActual{Mes}));

			if ($Prestamo{Valido} == 1)
			{
				my $Diferencia=abs($MaeActual{MontoRestante}-$Prestamo{MontoRestante});
				my $Porcentaje=0;

				if(abs($MaeActual{MontoRestante})!=0){
					$Porcentaje= ($Diferencia/abs($MaeActual{MontoRestante}))*100;
				}

				# -- Cuarto Paso --
				if($Porcentaje > $PorcentajeComparacion){
					$Salida{CodigoPrestamo} = $MaeActual{CodigoPrestamo};
					$Salida{MontoMaestro} = $MaeActual{MontoRestante};
					$Salida{MontoPrestamo} = $Prestamo{MontoRestante};
					$Salida{Porcentaje} = $Porcentaje;
					push @SALIDA, {%Salida};
				}
			}
		}
	}
	&MostrarResultadosConsulta2(@SALIDA);
}

sub MostrarResultadosConsulta2
{
	my(@SALIDA) = @_;
	my $arrSize = @SALIDA;
	# Títulos
	my $CodigoPrestamoTitulo = sprintf("%17s", 'Cód.Pŕestamo');
	my $MontoMaestroTitulo = sprintf("%24s", 'Monto Restante (MAE)');
	my $MontoPrestamoTitulo = sprintf("%26s", 'Monto Restante (PREST)');
	my $PorcentajeTitulo = sprintf("%13s", 'Porcentaje');

	my $Titulo = "$CodigoPrestamoTitulo"."|"."$MontoMaestroTitulo"."|"."$MontoPrestamoTitulo"."|"."$PorcentajeTitulo"."|"."\n";

	print "$Titulo";
	if ($grabarEnArchivo)
	{
		&crearArchivoSalida;
		&printConfiguracionArchivo;
		print ARCH_SALIDA "$Titulo";
	}

	for (my $i=0; $i < $arrSize; $i++)
	{
		my $CodigoPrestamo = sprintf("%15s", $SALIDA[$i]{CodigoPrestamo});
		my $MontoMaestro = sprintf("%24s", $SALIDA[$i]{MontoMaestro});
		my $MontoPrestamo = sprintf("%26s", $SALIDA[$i]{MontoPrestamo});
		my $Porcentaje = sprintf("%11.2f %%", $SALIDA[$i]{Porcentaje});

		my $mostrar = "$CodigoPrestamo"."|"."$MontoMaestro"."|"."$MontoPrestamo"."|"."$Porcentaje"."|"."\n";

		if ($grabarEnArchivo) {
			print ARCH_SALIDA "$mostrar";
		}
		print "$mostrar";
	}
	if ($grabarEnArchivo) {&cerrarArchivoSalida;}
}
sub DiferenciaEnPesos{

	my($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta,$MontoComparacion) = @_;

	if ($CodigoSistema eq "") { $CodigoSistema = "[^;]*"; }
	if ($AnoContableDesde eq "") { $AnoContableDesde = "2001"; }
	if ($MesContableDesde eq "") { $MesContableDesde = "1"; }
	if ($AnoContableHasta eq "") { $AnoContableHasta = "2020"; }
	if ($MesContableHasta eq "") { $MesContableHasta = "12"; }

	$MesContableDesdeFormateado = sprintf("%02d", $MesContableDesde);
	$FechaContableDesde = "${AnoContableDesde}${MesContableDesdeFormateado}01";
	$MesContableHastaFormateado = sprintf("%02d", $MesContableHasta);
	$FechaContableHasta = "${AnoContableHasta}${MesContableHastaFormateado}31";

	# 1. Filtro el archivo maestro
	my @FILTRO_MAE = &FiltrarMae($Pais,$CodigoSistema,$AnoContableDesde,$MesContableDesde,$AnoContableHasta,$MesContableHasta);
	#print @FILTRO_MAE;

	my @SALIDA;
	# 2. Calculo el monto restante de cada registro del maestro
	foreach my $regmae (@FILTRO_MAE)
	{
		my %MaeActual = &CargarDatosRegMae($regmae);
		if ($MaeActual{Valido} == 1)
		{
			my %Prestamo = &ObtenerPrestamo($Pais,$MaeActual{CodigoPrestamo},$MaeActual{Anio},sprintf("%02d",$MaeActual{Mes}));

			if ($Prestamo{Valido} == 1)
			{
				my $Diferencia=abs($MaeActual{MontoRestante}-$Prestamo{MontoRestante});

				# -- Cuarto Paso --
				if($Diferencia > $MontoComparacion)
				{
					$Salida{CodigoPrestamo} = $MaeActual{CodigoPrestamo};
					$Salida{MontoMaestro} = $MaeActual{MontoRestante};
					$Salida{MontoPrestamo} = $Prestamo{MontoRestante};
					$Salida{Diferencia} = $Diferencia;
					push @SALIDA, {%Salida};
				}
			}
		}
	}
	&MostrarResultadosConsulta3(@SALIDA);
}

sub MostrarResultadosConsulta3
{
	my(@SALIDA) = @_;
	my $arrSize = @SALIDA;
	# Títulos
	my $CodigoPrestamoTitulo = sprintf("%17s", 'Cód.Pŕestamo');
	my $MontoMaestroTitulo = sprintf("%24s", 'Monto Restante (MAE)');
	my $MontoPrestamoTitulo = sprintf("%26s", 'Monto Restante (PREST)');
	my $DiferenciaTitulo = sprintf("%17s", 'Diferencia ($)');

	my $Titulo = "$CodigoPrestamoTitulo"."|"."$MontoMaestroTitulo"."|"."$MontoPrestamoTitulo"."|"."$DiferenciaTitulo"."|"."\n";

	print "$Titulo";
	if ($grabarEnArchivo)
	{
		&crearArchivoSalida;
		&printConfiguracionArchivo;
		print ARCH_SALIDA "$Titulo";
	}

	for (my $i=0; $i < $arrSize; $i++)
	{
		my $CodigoPrestamo = sprintf("%15s", $SALIDA[$i]{CodigoPrestamo});
		my $MontoMaestro = sprintf("%24s", $SALIDA[$i]{MontoMaestro});
		my $MontoPrestamo = sprintf("%26s", $SALIDA[$i]{MontoPrestamo});
		my $Diferencia = sprintf("%17.2f", $SALIDA[$i]{Diferencia});

		my $mostrar = "$CodigoPrestamo"."|"."$MontoMaestro"."|"."$MontoPrestamo"."|"."$Diferencia"."|"."\n";

		if ($grabarEnArchivo) {
			print ARCH_SALIDA "$mostrar";
		}
		print "$mostrar";
	}
	if ($grabarEnArchivo) {&cerrarArchivoSalida;}
}

sub crearArchivoSalida{
	$archivo = &obtenerNuevoNombre();
	$ARCHIVO_SALIDA = $PATH_ARCHIVO_SALIDA."/".$archivo;
	open(ARCH_SALIDA,">$ARCHIVO_SALIDA" )|| die "Lo siento, no puedo crear $ARCHIVO_SALIDA\n";   
}

sub cerrarArchivoSalida{	
	close(ARCH_SALIDA);
}

sub obtenerArchivosDeDirectorio {
        my @aux;
        if(opendir (DIR, "$_[0]")) {
                @_ = readdir(DIR);
                close DIR;      
                foreach my $directorio (@_) {                  
                        push(@aux, $directorio) if ($directorio !~ /^\.+$/);
                }
        }      
        return @aux;
}

sub obtenerNuevoNombre {
        my @aux = obtenerArchivosDeDirectorio "$PATH_ARCHIVO_SALIDA/";
        return "ReporteY.1" if ($#aux == -1);    # si esta vacio
        my $maximo = 1;
        my $var = 0;
        foreach $var (@aux) {
		my @file = split(/\./,$var);
		my $num = $file[1];
		$maximo = $num if ($num > $maximo);
        }
        return "ReporteY.".++$maximo;
}

